package com.taxi.controller;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.taxi.service.AlipayService;
import com.taxi.config.AlipayConfig;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: aniu
 * @Date: 2023/10/12
 * @ClassName: ApiPayController
 * @Description: Write class functionality and purpose here.
 * @Version: 1.0
 */
@Controller
@RequestMapping("/alipay")
@ResponseBody
public class ApiPayController {
    @Autowired
    private AlipayService alipayService;

    @Autowired
    private AlipayConfig alipayConfig;

    @ApiOperation("支付")
    @GetMapping("/pay")
    public String pay(String subject,String outTradeNo,String totalAmount){
        AlipayTradePagePayResponse response;
        try {
            /**
             * subject : 订单名
             * outTradeNo : 订单号
             * totalAmount : 订单金额
             * returnUrl : 回调地址 后端需要过滤处理订单数据就回调后端，不需要直接回调前端url就行，
             * 同步回调后端也可以获的订单数据
             */
            response= Factory.Payment.Page().pay(subject,outTradeNo,totalAmount,alipayConfig.getReturnUrl());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
        return response.getBody();
    }

    /**
     * @return
     * @description 同步回调 让他重新跳转到自己网站支付成功界面
     */
    @RequestMapping("/return")
    public RedirectView returnMethod(HttpServletRequest request) throws Exception {
        System.out.println("支付宝同步回调 return");
        // 获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<>();
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (String name: parameterMap.keySet()) {
            params.put(name,request.getParameter(name));
        }
        String jsonStr = new ObjectMapper().writeValueAsString(params);
        System.out.println(jsonStr);
//        if (Factory.Payment.Common().verifyNotify(params)){
//            System.out.println("通过支付宝的验证");
//            // 商户订单号
//            String out_trade_no = params.get("out_trade_no");
//            // 支付宝交易流水号
//            String trade_no = params.get("trade_no");
//            // 付款金额
//            float money = Float.parseFloat(params.get("total_amount"));
//            System.out.println("商户订单号=" + out_trade_no);
//            System.out.println("支付宝交易号=" + trade_no);
//            System.out.println("付款金额=" + money);
////            在这里编写自己的业务代码（对数据库的操作），不建议
////            同步就是给用户看的，当然这里可以处理订单状态入库，但如果用户由于网络原因退出了，
////            会导致这里同步调用失败，订单状态未改变，所以用异步调用让支付宝调用我们的服务端异步回调地址
////            异步调用当支付宝收到 return success 才会停止调用，保证了订单正常入库
//        }else {
//            System.out.println("支付宝验证不通过！");
//        }
        // 重定向前端页面  自己前端可以写个成功页面，也可以直接到首页，看需求
        return new RedirectView(alipayConfig.getFrontReturnUrl());
    }

    /**
     * 异步回调
     * @param request
     * @return
     * @throws Exception
     * @discription 支付宝异步通知我们的服务端
     */
    @PostMapping("/notify")
    public String notifyMethod(HttpServletRequest request) throws Exception {
        System.out.println("支付宝异步回调 notify");
        try{
            String tradeStatus = request.getParameter("trade_status");
            if (tradeStatus.trim().equals("TRADE_SUCCESS")){
                Map<String,String> params = new HashMap<>();
                Map<String, String[]> parameterMap = request.getParameterMap();
                for (String name: parameterMap.keySet()) {
                    params.put(name,request.getParameter(name));
                }
                if(Factory.Payment.Common().verifyNotify(params)){
                    System.out.println("通过支付宝的验证");
                    String out_trade_no = params.get("out_trade_no");
                    Long orderId = Long.parseLong(out_trade_no);
                    alipayService.pay(orderId);
                    return "success";  // 返回 success 支付宝那边才不会重试
                }else {
                    System.out.println("支付宝验证不通过！");
                    return null;
                }
            }
        }catch (Exception e){
            return null;
        }
        return null;
    }
}
